/*
 * @Description: 管理员逻辑模块
 * @Author: pinus
 * @Email: pinus0716@163.com
 * @Git: https://gitee.com/xyf97
 * @Date: 2021-10-06 20:43:30
 * @LastEditTime: 2021-10-09 20:26:12
 */
const path = require('path')
const Password = require('node-php-password')
const managersDAO = require(path.join(process.cwd(), 'dao/ManagerDAO'))
const logger = require(path.join(process.cwd(), 'modules/logger')).logger()

/**
 * @description: 登录
 * @param {*} username - 用户名
 * @param {*} password - 密码
 * @param {Function} cb- 回调
 * @return {*}
 */
module.exports.login = function (username, password, cb) {
  logger.debug('login => username:%s,password:%s', username, password)
  const options = {
    where: {
      mg_name: username
    }
  }
  managersDAO.findOne(options, (err, manager) => {
    logger.debug(err)
    if (err || !manager) return cb('用户不存在')
    if (manager.role_id < 0) return cb('该用户没有权限')
    if (manager.role_id != 0 && manager.mg_state != 1) return cb('该用户已被禁用')

    if (Password.verify(password, manager.mg_pwd)) {
      logger.debug('登录成功')
      cb(null, {
        id: manager.mg_id,
        rid: manager.role_id,
        username: manager.mg_name,
        mobile: manager.mg_mobile,
        email: manager.mg_email
      })
    } else {
      logger.debug('登录失败')
      return cb('密码错误')
    }
  })
}

/**
 * @description: 获取所有管理员
 * @param {*} conditions - 查询条件
 * conditions
	{
		"query" : 关键词查询,
		"pagenum" : 页数,
		"pagesize" : 每页长度
	}
 * @param {Function} cb
 * @return {*}
 */
module.exports.getAllManagers = function (conditions, cb) {
  if (!conditions.pagenum) return cb('pagenum 参数不合法')
  if (!conditions.pagesize) return cb('pagesize 参数不合法')

  // 获取管理员的数量
  managersDAO.countByKey(conditions['query'], (err, count) => {
    const key = conditions['query']
    const pagenum = parseInt(conditions['pagenum'])
    const pagesize = parseInt(conditions['pagesize'])
    const pageCount = Math.ceil(count / pagesize) // 总共页数

    const offset = (pagenum - 1) * pagesize
    if (offset >= count) {
      offset = count
    }
    const limit = pagesize

    managersDAO.findByKey(key, offset, limit, (err, managers) => {
      let retManagers = []
      for (idx in managers) {
        const manager = managers[idx]
        let role_name = manager.role_name
        if (!manager.role_id) {
          role_name = '超级管理员'
        }
        retManagers.push({
          id: manager.mg_id,
          role_name: role_name,
          username: manager.mg_name,
          create_time: manager.mg_time,
          mobile: manager.mg_mobile,
          email: manager.mg_email,
          mg_state: manager.mg_state == 1
        })
      }
      let resultDta = {}
      resultDta['total'] = count
      resultDta['pagenum'] = pagenum
      resultDta['users'] = retManagers
      cb(err, resultDta)
    })
  })
}

/**
 * @description: 通过管理员 ID 获取管理员信息
 * @param {*} id
 * @param {*} cb
 * @return {*}
 */
module.exports.getManager = function (id, cb) {
  managersDAO.show(id, function (err, manager) {
    if (err) return cb(err)
    if (!manager) return cb('该管理员不存在')
    cb(null, {
      id: manager.mg_id,
      rid: manager.role_id,
      username: manager.mg_name,
      mobile: manager.mg_mobile,
      email: manager.mg_email
    })
  })
}

/**
 * @description: 创建管理员
 * @param {*} params
 * @param {*} cb
 * @return {*}
 */
module.exports.createManager = function (params, cb) {
  managersDAO.exists(params.username, (err, isExists) => {
    if (err) return cb(err)

    if (isExists) {
      return cb('用户名已存在')
    }

    managersDAO.create(
      {
        mg_name: params.username,
        mg_pwd: Password.hash(params.password),
        mg_mobile: params.mobile,
        mg_email: params.email,
        mg_time: Date.parse(new Date()) / 1000,
        role_id: params.rid
      },
      function (err, manager) {
        if (err) return cb('创建失败')
        result = {
          id: manager.mg_id,
          username: manager.mg_name,
          mobile: manager.mg_mobile,
          email: manager.mg_email,
          role_id: manager.role_id,
          create_time: manager.mg_time
        }
        cb(null, result)
      }
    )
  })
}

/**
 * @description: 修改管理员状态
 * @param {*} id
 * @param {*} state
 * @param {*} cb
 * @return {*}
 */
module.exports.updateMgrState = function (id, state, cb) {
  managersDAO.show(id, (err, manager) => {
    if (err) cb('出错-' + err)
    if (!manager) cb('管理员未找到')

    managersDAO.update(
      {
        mg_id: manager.mg_id,
        mg_state: state
      },
      (err, manager) => {
        if (err) return cb('设置失败')
        cb(null, {
          id: manager.mg_id,
          rid: manager.role_id,
          username: manager.mg_name,
          mobile: manager.mg_mobile,
          email: manager.mg_email,
          mg_state: manager.mg_state ? 1 : 0
        })
      }
    )
  })
}

/**
 * @description: 修改管理员信息
 * @param {*} params
 * @param {*} cb
 * @return {*}
 */
module.exports.updateManager = function (params, cb) {
  managersDAO.update(
    {
      mg_id: params.id,
      mg_mobile: params.mobile,
      mg_email: params.email
    },
    function (err, manager) {
      if (err) return cb(err)
      cb(null, {
        id: manager.mg_id,
        username: manager.mg_name,
        role_id: manager.role_id,
        mobile: manager.mg_mobile,
        email: manager.mg_email
      })
    }
  )
}

/**
 * @description: 为管理员设置权限角色
 * @param {*} id
 * @param {*} rid
 * @param {*} cb
 * @return {*}
 */
module.exports.setRole = function (id, rid, cb) {
  managersDAO.show(id, function (err, manager) {
    if (err || !manager) cb('管理员ID不存在2')

    managersDAO.update({ mg_id: manager.mg_id, role_id: rid }, function (err, manager) {
      if (err) return cb('设置失败')
      cb(null, {
        id: manager.mg_id,
        rid: manager.role_id,
        username: manager.mg_name,
        mobile: manager.mg_mobile,
        email: manager.mg_email
      })
    })
  })
}

/**
 * @description: 通过管理员 ID 进行删除操作
 * @param {*} id
 * @param {*} cb
 * @return {*}
 */
module.exports.deleteManager = function (id, cb) {
  managersDAO.destroy(id, function (err) {
    if (err) return cb('删除失败')
    cb(null)
  })
}
